// const ws = require('nodejs-websocket');
import ws from "nodejs-websocket";

const PORT = 3000;

// function sendMesage(cmd, data) {
//   this.send(JSON.stringify({ code: "0", cmd: cmd, data: JSON.parse(data) }));
// }
//
// function pingHandler(data) {
//   this.sendMesage("ping", data);
// }
//
// //创建server,每次只要有用户连接，回调执行就会给用户创建一个connect对象
// const server = ws.createServer((connect) => {
//   console.log("用户连接成功");
//   //用户传来数据，触发text事件
//   connect.on("text", (data) => {
//     console.log(`接受到用户的数据:${data}`);
//     console.log({ code: "0", data });
//     console.log(JSON.stringify({ code: "0", data: JSON.parse(data) }));
//     //接受到数据后给用户响应数据
//     if (ms)
//       connect.send(
//         JSON.stringify({ code: "0", cmd: "push", data: JSON.parse(data) })
//       );
//   });
//
//   //连接关闭触发close事件
//   connect.on("close", () => {
//     console.log("连接断开");
//   });
//
//   //注册error事件,用户端口后就会触发该异常
//   connect.on("error", () => {
//     console.log("用户连接异常");
//   });
// });
//
// server.listen(PORT, () => {
//   console.log("监听3000");
// });
// const handler = {
//   ping: pingHandler,
// };

class myWebSocket {
  server;
  connect;
  processors = {
    ping: this.pingHandler,
    auth: this.authHandler,
    ack: this.ackHandler,
    open: this.pushHandler,
  };

  constructor(url) {
    this.server = ws.createServer((connect) => {
      console.log("wss.clients", this.server.clients);
      console.log("用户连接成功");
      this.connect = connect;
      //用户传来数据，触发text事件
      connect.on("text", (data) => {
        let msg = JSON.parse(data);
        let { cmd } = msg;
        console.log("cmd", cmd);
        if (this.processors[cmd]) {
          this.processors[cmd].call(this, msg);
        }
        //接受到数据后给用户响应数据
        // if (ms)
        //   connect.send(
        //     JSON.stringify({ code: "0", cmd: "push", data: JSON.parse(data) })
        //   );
      });
      //连接关闭触发close事件
      connect.on("close", (e) => {
        console.log("连接断开");
      });

      //注册error事件,用户端口后就会触发该异常
      connect.on("error", () => {
        // console.log("用户连接异常");
        this.handleError();
      });
    });
    this.server.listen(PORT, () => {
      console.log("监听3000");
    });
  }

  ackHandler(msg) {
    console.log("接受message", msg);
  }

  pushHandler(msg) {
    console.log("推送的信息");
    this.sendMsg("push", msg);
  }

  pingHandler(msg) {
    //心跳
    console.log("pingmsg", msg);
    this.sendMsg("pong", "心跳");
  }

  authHandler(msg) {
    //校验
    this.sendMsg("auth", "校验");
  }

  sendMsg(cmd, msg) {
    if (typeof msg !== "object") {
      msg = { msg };
    }
    this.connect.send(JSON.stringify({ code: "0", cmd: cmd, data: msg }));
  }

  handleError() {
    this.connect.send(
      JSON.stringify({ code: "error", cmd: "error", data: { msg: "连接失败" } })
    );
  }
}

new myWebSocket();
